package EA.testproblems;
import EA.*;

/**

<table border="0" cellpadding="2" cellspacing="0">
<tr bgcolor="#a0a0a0">
  <td colspan="2" valign="top"><b>Problem description</b></td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top" width="200"><b>Name:</b></td>
  <td valign="top">Bohachevsky F3</td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>Nickname:</b></td>
  <td valign="top">&nbsp;</td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>Intended usage:</b></td>
  <td valign="top">Test of multimodal on problems with extremely many peaks.</td>
</tr>

<tr>
  <td colspan="2" valign="top">&nbsp;</td>
</tr>
<tr bgcolor="#a0a0a0">
  <td colspan="2" valign="top"><b>Problem details</b></td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>Function:</b></td>
  <td valign="top"> x<sup>2</sup> + 2*y<sup>2</sup> - 0.3*cos(3*pi*x + 4*pi*y) + 0.3</td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>Plots:</b></td>
  <td valign="top"><img src="../../images/testproblems/bohachevskyf3.gif">&nbsp;&nbsp;
<img src="../../images/testproblems/bohachevskyf3_contour.gif"></td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>Ranges:</b></td>
  <td valign="top">x = [-50:50]&nbsp;&nbsp;y = [-50:50] </td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>Type:</b></td>
  <td valign="top">Minimization</td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>No. of maximas:</b></td>
  <td valign="top">More than 50</td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>No. of minimas:</b></td>
  <td valign="top">More than 50</td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>Optima radius:</b></td>
  <td valign="top">0.2</td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>Optima descriptions:</b></td>
  <td valign="top">The minimas are located near (0,0)</td>
</tr>
<tr bgcolor="#e0e0e0">
  <td valign="top"><b>Known optimas:</b></td>
  <td valign="top">
GMIN(0, 0)

<br><font size=1>Capital letters 
means that the precise optima is known, lowercase letters is the best known 
so far.</font></td>
</tr>
<tr>
  <td colspan="2" valign="top">&nbsp;</td>
</tr>
<tr bgcolor="#a0a0a0">
  <td colspan="2" valign="top"><b>Plotting details</b></td>
</tr>

<tr bgcolor="#e0e0e0">
  <td valign="top"><b>GNUPlot code:</b></td>
  <td valign="top">
  set hidden3d<br>
  set isosamples 70<br>
  set view 60,20<br>
  splot [-2:2] [-2:2]  x*x + 2*y*y - 0.3*cos(3*pi*x + 4*pi*y) + 0.3<br>
</td>
</tr>
</table>
*/
public class BohachevskyF3 extends NumericalProblem 
{

  // Easier way to build max and min
    private double[][] lmax = new double[0][2];
    private double[][] lmin = {{-1.341554449, -.8943696325}, 
			       {-1.013899291, -.6759328606}, 
			       {-.6777951338, -.4518634225}, 
			       {-.3393255483, -.2262170322}, 
			       {0, 0}, 
			       {.3393255483, .2262170322},
			       {.6777951338, .4518634225}, 
			       {1.013899291, .6759328606},
			       {1.341554449, .8943696325}}; 

    public BohachevskyF3()
    {
      super();

      double[] optimas;

      name = "Bohachevsky function #3";
      objectivefunction = new NumericalFitness(){
	      public double Fitness_calcFitness_inner(double[] realpos)
	      {
		  return realpos[0]*realpos[0] + 2*realpos[1]*realpos[1] - 0.3*Math.cos(3*Math.PI*realpos[0] + 4*Math.PI*realpos[1]) + 0.3;
	      };
	  };

      dimensions = 2;
      ismaximization = false;
      optimumradius = 0.2;

      intervals = new Interval[2];
      intervals[0] = new Interval(-50, 50);
      intervals[1] = new Interval(-50, 50);
      
      // Set up known maximas
      knownmaxima = new NumericalOptimum[lmax.length];

      for (int i=0;i<lmax.length;i++) {
	optimas = new double[dimensions];
	optimas[0] = lmax[i][0];
	optimas[1] = lmax[i][1];
	knownmaxima[i] = new NumericalOptimum(optimas, objectivefunction.calcFitness(optimas), true, false, i);
      }

      // Set up known minimas
      knownminima = new NumericalOptimum[lmin.length];

      for (int i=0;i<lmin.length;i++) {
	optimas = new double[dimensions];
	optimas[0] = lmin[i][0];
	optimas[1] = lmin[i][1];
	knownminima[i] = new NumericalOptimum(optimas, objectivefunction.calcFitness(optimas), false, false, i);
      }
    }
}
